package br.com.mynage.controller;

import java.io.NotSerializableException;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import br.com.mynage.dominio.Projeto;
import br.com.mynage.dominio.Usuario;
import br.com.mynage.exception.DaoException;
import br.com.mynage.exception.NegocioException;
import br.com.mynage.jsf.LoginMBean;
import br.com.mynage.service.IServiceProjeto;
import br.com.mynage.service.impl.ServiceProjetoImpl;

@ManagedBean(name="projetoMBean")
@ViewScoped
public class ProjetoMBean extends NotSerializableException { 
	private static final long serialVersionUID = 1L;
	
	private Projeto projetoCadastrar;
	private Projeto projetoRemover;
	private Projeto projetoEditar;
	private boolean vaiEditar;
	public  List<Projeto> listaProjetos;
	private List<String> listaEmails;
	private List<String> listaEmailsEditar;
	private String email;
	
	private IServiceProjeto iServiceProjeto;
	
	public ProjetoMBean(){
		this.vaiEditar = false;
		this.iServiceProjeto = new ServiceProjetoImpl();
		
		this.projetoCadastrar = new Projeto();
		
		this.listaEmails = new ArrayList<String>();
		this.listaEmailsEditar = new ArrayList<String>();
		
		try {
			this.listaProjetos = this.iServiceProjeto.buscarProjetosPorUsuario(LoginMBean.usuario);
		} catch (DaoException e) {
			this.listaProjetos = new ArrayList<Projeto>();
		}
	}
	
	public String cadastrarProjeto(){
		try {
			iServiceProjeto.cadastrarProjeto(this.projetoCadastrar, this.listaEmails);
		} catch (DaoException e) {
			FacesContext.getCurrentInstance().addMessage
					(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Erro Banco de dados",
					"Por favor, entre em contato com a administração"));
			e.printStackTrace();
		} catch (NegocioException e) {
			FacesContext.getCurrentInstance().addMessage
					(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Dados preenchidos incorretamente",
					"Por favor preencha os dados corretamente"));
			e.printStackTrace();
		}
		
		this.limpar();
		
		return null;
	}
	
	private void limpar() {
		try {
			this.listaProjetos = this.iServiceProjeto.buscarProjetosPorUsuario(LoginMBean.usuario);
		} catch (DaoException e) {
			this.listaProjetos = new ArrayList<Projeto>();
		}
		
		this.projetoCadastrar = new Projeto();
		this.listaEmails = new ArrayList<String>();
	}

	public String removerProjeto(){
		try {
			iServiceProjeto.remover(this.projetoRemover);
			this.listaProjetos = this.iServiceProjeto.buscarProjetosPorUsuario(LoginMBean.usuario);
		} catch (DaoException e) {
			FacesContext.getCurrentInstance().addMessage
				(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Erro Banco de dados",
				"Por favor, entre em contato com a administra��o"));
			e.printStackTrace();
		} catch (NegocioException e) {
			FacesContext.getCurrentInstance().addMessage
				(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Dados preenchidos incorretamente",
				"Por favor preencha os dados corretamente"));
			e.printStackTrace();
		}
		
		return null;
	}
	
	public String editarProjeto(){
		try {
			this.iServiceProjeto.editar(this.projetoEditar, this.listaEmailsEditar);
			this.vaiEditar = false;
			
			FacesContext.getCurrentInstance().addMessage
					(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", 
					"Opera��o realizada com sucesso!"));  
		} catch (DaoException e) {
			FacesContext.getCurrentInstance().addMessage
					(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Erro Banco de dados",
					"Por favor, entre em contato com a administra��o"));
			e.printStackTrace();
		} catch (NegocioException e) {
			FacesContext.getCurrentInstance().addMessage
					(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Dados preenchidos incorretamente",
					"Por favor preencha os dados corretamente"));
			e.printStackTrace();
		}
		
		return null;
	}
	
	public String editar(){
		this.vaiEditar = true;
		
		return null;
	}
	
	public String cancelarEdicaoProjeto(){
		this.vaiEditar = false;
		
		return "";
	}
	
	public String addEmail(){
		this.listaEmails.add(this.email);
		this.email = "";
		
		return null;
	}
	
	public String addEmailEditar(){
		this.listaEmailsEditar.add(this.email);
		this.email = "";
		
		return null;
	}
	
	public void removeEmail(){
		this.listaEmails.remove(this.email);
	}
	
	public void removeEmailEditar(){
		this.listaEmailsEditar.remove(this.email);
	}
	
	public String mudarPaginaEditar(){
		return "projeto/editarprojeto";
	}

	public Projeto getProjetoCadastrar() {
		return projetoCadastrar;
	}

	public void setProjetoCadastrar(Projeto projetoCadastrar) {
		this.projetoCadastrar = projetoCadastrar;
	}

	public List<Projeto> getListaProjetos() {
		return listaProjetos;
	}

	public void setListaProjetos(List<Projeto> listaProjetos) {
		this.listaProjetos = listaProjetos;
	}

	public Projeto getProjetoRemover() {
		return projetoRemover;
	}

	public void setProjetoRemover(Projeto projetoRemover) {
		this.projetoRemover = projetoRemover;
	}

	public Projeto getProjetoEditar() {
		return projetoEditar;
	}

	public void setProjetoEditar(Projeto projetoEditar) {
		this.listaEmailsEditar = new ArrayList<String>();
		for(Usuario usuario : projetoEditar.getUsuarios()){
			this.listaEmailsEditar.add(usuario.getEmail());
		}
		
		this.projetoEditar = projetoEditar;
	}

	public List<String> getListaEmails() {
		return listaEmails;
	}

	public void setListaEmails(List<String> listaEmails) {
		this.listaEmails = listaEmails;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public boolean isVaiEditar() {
		return vaiEditar;
	}

	public void setVaiEditar(boolean vaiEditar) {
		this.vaiEditar = vaiEditar;
	}

	public List<String> getListaEmailsEditar() {
		return listaEmailsEditar;
	}

	public void setListaEmailsEditar(List<String> listaEmailsEditar) {
		this.listaEmailsEditar = listaEmailsEditar;
	}
	
	public String listar() {
		return "/projeto/index";
	}

}
